package annotation;

import java.lang.annotation.*;
import java.lang.reflect.Method;

// 容器注解（必须包含 value() 方法，类型为可重复注解的数组）
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented // 关键：添加 @Documented，与可重复注解保持一致
@Inherited
@interface Roles {
    Role[] value(); // 数组类型必须是可重复注解（Role）
}


// 可重复注解（Java 8+）
@Repeatable(Roles.class)
@Retention(RetentionPolicy.RUNTIME) // 生命周期：运行时保留
@Target({ElementType.METHOD, ElementType.TYPE}) // 适用目标：方法和类
@Documented // 生成文档时包含该注解
@Inherited // 允许子类继承父类的该注解
@interface Role {
    String value();
}

// 父类使用注解
@Role("admin")
class BaseService {}

// 子类继承父类的注解（因为@Inherited）
class UserV2Service extends BaseService {
    public void operate() {}
}

public class MetaAnnotations {
    public static void main(String[] args) {
        // 检查子类是否继承了父类的注解
        System.out.println("UserService是否有@Role注解：" +
                UserV2Service.class.isAnnotationPresent(Role.class));

        // 检查方法上的重复注解
        try {
            Method method = UserService.class.getMethod("operate");
            Roles roles = method.getAnnotation(Roles.class);
            for (Role role : roles.value()) {
                System.out.println("方法注解：" + role.value());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

